//
//  DMLifecycleDelegateRegistry.h
//  DualMediationSDK
//
//  统一代理注册中心
//  负责管理所有生命周期相关的代理注册和分发
//

#import <Foundation/Foundation.h>
#import "../Types/DMLifecycleTypes.h"
#import "../Types/DMLifecycleProtocols.h"

NS_ASSUME_NONNULL_BEGIN

@protocol DMAdDelegate;

/**
 * 统一代理注册中心
 * 所有生命周期相关的代理都通过此中心进行统一管理
 */
@interface DMLifecycleDelegateRegistry : NSObject

#pragma mark - 单例访问

/**
 * 获取代理注册中心单例
 * @return 代理注册中心实例
 */
+ (instancetype)sharedRegistry;

#pragma mark - 生命周期代理注册

/**
 * 注册生命周期事件监听器
 * @param delegate 监听器对象
 */
- (void)registerLifecycleDelegate:(id<DMLifecycleEventListener>)delegate;

/**
 * 注册生命周期事件监听器（带优先级）
 * @param delegate 监听器对象
 * @param priority 优先级（数值越小优先级越高）
 */
- (void)registerLifecycleDelegate:(id<DMLifecycleEventListener>)delegate withPriority:(NSInteger)priority;

/**
 * 注销生命周期事件监听器
 * @param delegate 监听器对象
 */
- (void)unregisterLifecycleDelegate:(id<DMLifecycleEventListener>)delegate;

#pragma mark - SDK回调代理注册

/**
 * 注册SDK代理（便捷方法）
 * @param delegate SDK代理对象
 */
- (void)registerSDKDelegate:(id<DMSDKLifecycleDelegate>)delegate;

/**
 * 注册SDK回调代理
 * @param delegate SDK回调代理对象
 */
- (void)registerSDKCallbackDelegate:(id<DMSDKLifecycleDelegate>)delegate;

/**
 * 注销SDK回调代理
 * @param delegate SDK回调代理对象
 */
- (void)unregisterSDKCallbackDelegate:(id<DMSDKLifecycleDelegate>)delegate;

#pragma mark - Facebook代理注册

/**
 * 注册Facebook回调代理
 * @param delegate Facebook回调代理对象
 */
- (void)registerFacebookDelegate:(id<DMFacebookCallbackDelegate>)delegate;

/**
 * 注销Facebook回调代理
 * @param delegate Facebook回调代理对象
 */
- (void)unregisterFacebookDelegate:(id<DMFacebookCallbackDelegate>)delegate;

#pragma mark - 广告代理注册

/**
 * 注册广告代理
 * @param delegate 广告代理对象
 */
- (void)registerAdDelegate:(id<DMAdDelegate>)delegate;

/**
 * 注册广告代理（带优先级）
 * @param delegate 广告代理对象
 * @param priority 优先级（数值越小优先级越高）
 */
- (void)registerAdDelegate:(id<DMAdDelegate>)delegate withPriority:(NSInteger)priority;

/**
 * 注销广告代理
 * @param delegate 广告代理对象
 */
- (void)unregisterAdDelegate:(id<DMAdDelegate>)delegate;

#pragma mark - 扩展代理注册

/**
 * 注册生命周期扩展
 * @param extension 扩展对象
 */
- (void)registerLifecycleExtension:(id<DMLifecycleExtension>)extension;

/**
 * 注销生命周期扩展
 * @param identifier 扩展标识符
 */
- (void)unregisterLifecycleExtension:(NSString *)identifier;

/**
 * 获取生命周期扩展
 * @param identifier 扩展标识符
 * @return 扩展对象
 */
- (nullable id<DMLifecycleExtension>)getLifecycleExtension:(NSString *)identifier;

#pragma mark - 代理查询

/**
 * 获取所有生命周期监听器
 * @return 监听器数组（按优先级排序）
 */
- (NSArray<id<DMLifecycleEventListener>> *)getAllLifecycleDelegates;

/**
 * 获取指定优先级的生命周期监听器
 * @param priority 优先级
 * @return 监听器数组
 */
- (NSArray<id<DMLifecycleEventListener>> *)getLifecycleDelegatesWithPriority:(NSInteger)priority;

/**
 * 获取所有SDK回调代理
 * @return SDK回调代理数组
 */
- (NSArray<id<DMSDKLifecycleDelegate>> *)getAllSDKCallbackDelegates;

/**
 * 获取所有Facebook回调代理
 * @return Facebook回调代理数组
 */
- (NSArray<id<DMFacebookCallbackDelegate>> *)getAllFacebookDelegates;

/**
 * 获取所有广告代理
 * @return 广告代理数组（按优先级排序）
 */
- (NSArray<id<DMAdDelegate>> *)getAllAdDelegates;

/**
 * 获取指定优先级的广告代理
 * @param priority 优先级
 * @return 广告代理数组
 */
- (NSArray<id<DMAdDelegate>> *)getAdDelegatesWithPriority:(NSInteger)priority;

/**
 * 获取所有生命周期扩展
 * @return 扩展数组（按优先级排序）
 */
- (NSArray<id<DMLifecycleExtension>> *)getAllLifecycleExtensions;

#pragma mark - 代理管理

/**
 * 移除所有代理
 */
- (void)removeAllDelegates;

/**
 * 移除所有生命周期监听器
 */
- (void)removeAllLifecycleDelegates;

/**
 * 移除所有SDK回调代理
 */
- (void)removeAllSDKCallbackDelegates;

/**
 * 移除所有Facebook回调代理
 */
- (void)removeAllFacebookDelegates;

/**
 * 移除所有广告代理
 */
- (void)removeAllAdDelegates;

/**
 * 移除所有生命周期扩展
 */
- (void)removeAllLifecycleExtensions;

#pragma mark - 统计信息

/**
 * 获取代理统计信息
 * @return 统计信息字典
 */
- (NSDictionary *)getDelegateStatistics;

/**
 * 获取生命周期监听器数量
 * @return 监听器数量
 */
- (NSUInteger)getLifecycleDelegateCount;

/**
 * 获取SDK回调代理数量
 * @return 代理数量
 */
- (NSUInteger)getSDKCallbackDelegateCount;

/**
 * 获取Facebook回调代理数量
 * @return 代理数量
 */
- (NSUInteger)getFacebookDelegateCount;

/**
 * 获取广告代理数量
 * @return 代理数量
 */
- (NSUInteger)getAdDelegateCount;

/**
 * 获取生命周期扩展数量
 * @return 扩展数量
 */
- (NSUInteger)getLifecycleExtensionCount;

@end

NS_ASSUME_NONNULL_END
